﻿using System.Reflection;

namespace CleanLite.DynamicApi
{
    /// <summary>
    /// 动态 API 框架配置项。
    /// </summary>
    /// <remarks>
    /// 用于统一管理动态 API 的命名规则、程序集来源以及控制器生成策略。
    /// 这些配置项可通过外部配置文件或代码方式进行调整。
    /// </remarks>
    public class DynamicApiOptions
    {
        /// <summary>
        /// 控制器名称忽略后缀。
        /// </summary>
        /// <remarks>
        /// 用于移除类型名称中指定的后缀，默认忽略 <c>Service</c>。
        /// 例如：<c>UserService</c> → <c>User</c>。
        /// 可通过配置项 <c>IgnoreControllerSuffix</c> 自定义。
        /// </remarks>
        public List<string> IgnoreControllerSuffix { get; set; } = [];

        /// <summary>
        /// 方法名称忽略后缀。
        /// </summary>
        /// <remarks>
        /// 用于移除方法名中指定的后缀，默认忽略 <c>Async</c>。
        /// 例如：<c>GetUserAsync</c> → <c>GetUser</c>。
        /// 可通过配置项 <c>IgnoreMethodSuffix</c> 自定义。
        /// </remarks>
        public List<string> IgnoreMethodSuffix { get; set; } = [];

        /// <summary>
        /// 接口默认前缀。
        /// </summary>
        /// <remarks>
        /// 用于统一控制所有动态生成的路由前缀，默认值为 <c>api</c>。
        /// 可通过配置项 <c>ApiPrefix</c> 修改。
        /// </remarks>
        public string ApiPrefix { get; set; } = "api";

        /// <summary>
        /// 自定义控制器功能提供者
        /// </summary>
        /// <remarks>
        /// 用于控制动态API功能识别控制器的策略，
        /// 例如判断哪些类应被视为控制器。
        /// <para>可在<see cref="DynamicController.IsController"/> 中重写自定义逻辑</para>
        /// </remarks>
        public ICustomControllerFeatureProvider CustomControllerFeatureProvider { get; set; } = new DefaultCustomControllerFeatureProvider();

        /// <summary>
        /// 动态接口扫描程序集集合。
        /// </summary>
        /// <remarks>
        /// 指定需要扫描并生成动态接口的程序集集合。
        /// 通常包含应用层或服务层程序集。
        /// </remarks>
        public List<Assembly> Assemblys { get; set; } = [];
    }
}